home *** CD-ROM | disk | FTP | other *** search
/ Languguage OS 2 / Languguage OS II Version 10-94 (Knowledge Media)(1994).ISO / a_utils / perl / prlbkxmp.lha / ch6 / lndir < prev    next >
Text File  |  1991-01-08  |  2KB  |  101 lines

  1. #!/usr/bin/perl
  2. #
  3. # Usage: lndir old-dir new-dir
  4. #
  5. # Compare two directories, and link all identical files.
  6.  
  7. # Check args && fetch names.
  8.  
  9. ((($olddir,$newdir) = @ARGV) == 2 && -d $olddir && -d $newdir)
  10.     || die "Usage: $0 old-dir new-dir\n";
  11.  
  12. # Get all files in the new dir.
  13.  
  14. open(FIND,"find $newdir -type f -print|");
  15.  
  16. $|=1;
  17.  
  18. FILE: while ($new = <FIND>) {
  19.     chop $new;
  20.     ($file = $new) =~ s#^$newdir/##o
  21.     || die "find said $new?\n";
  22.     $old = "$olddir/$file";
  23.  
  24.     # Get stat info for both files.
  25.  
  26.     ($ndev,$nino,$nmode,$nnlink,$nuid,$ngid,$nrdev,$nsize,
  27.       $natime,$nmtime,$nctime,$nblksize,$nblocks)
  28.       = stat($new);
  29.  
  30.     unless ($nino) {
  31.     print "$new: $!\n";
  32.     next FILE;
  33.     }
  34.  
  35.     unless (-f _) {
  36.     warn "$new is not a plain file\n";
  37.     next FILE;
  38.     }
  39.  
  40.     ($odev,$oino,$omode,$onlink,$ouid,$ogid,$ordev,$osize,
  41.       $oatime,$omtime,$octime,$oblksize,$oblocks)
  42.       = stat($old);
  43.  
  44.     unless ($oino) {
  45.     next FILE;
  46.     }
  47.  
  48.     unless (-f _) {
  49.     warn "$old is not a plain file\n";
  50.     next FILE;
  51.     }
  52.  
  53.     # Quick check on size and mode.
  54.  
  55.     if ($nsize != $osize) {
  56.     print "$file differs\n";
  57.     next FILE;
  58.     }
  59.  
  60.     if ($nmode != $omode) {
  61.     print "$file mode differs\n";
  62.     next FILE;
  63.     }
  64.  
  65.     # Already linked?  (Perhaps symbolically?)
  66.     # Compare dev/inode numbers.
  67.  
  68.     if ($ndev == $odev && $nino == $oino) {
  69.     print "$file already linked\n";
  70.     next FILE;
  71.     }
  72.  
  73.     # Now compare the two files.
  74.  
  75.     unless (open(NEW,"$new")) {
  76.     print "$new: $!\n";
  77.     next FILE;
  78.     }
  79.     unless (open(OLD,"$old")) {
  80.     print "$old: $!\n";
  81.     next FILE;
  82.     }
  83.     $blksize = $nblksize || 8192;
  84.     while (read(OLD,$obuf,$blksize)) {
  85.     read(NEW,$nbuf,$blksize);
  86.     if ($obuf ne $nbuf) {
  87.         print "$file differs\n";
  88.         next FILE;
  89.     }
  90.     }
  91.  
  92.     # Okay, let's link.
  93.  
  94.     if (unlink($new) && link($old, $new)) {
  95.     print "$file linked to $old\n";
  96.     next FILE;
  97.     }
  98.  
  99.     print "$file: $!\n";
  100. }
  101.